多重文本替代 – Power Query爱好者

您所在的位置:网站首页 power query如何使用多重函数 多重文本替代 – Power Query爱好者

多重文本替代 – Power Query爱好者

2024-04-11 17:27| 来源: 网络整理| 查看: 265

在某些办公情景中,有时需要把同一列的多个文本替换成新的文本。假设现在需要把如下表格ProductList中Product列的"A(ii)", "B(ii)"以及"C(ii)"分别替换成"A", "B"以及"C":

对于这个问题,最直接的解决办法是进行三次常规替代,以下为该思路的代码:

let Step1 = Table.ReplaceValue( ProductList, "A(ii)", "A", Replacer.ReplaceText, {"Product"} ), Step2 = Table.ReplaceValue( Step1, "B(ii)", "B", Replacer.ReplaceText, {"Product"} ), Step3 = Table.ReplaceValue( Step2, "C(ii)", "C", Replacer.ReplaceText, {"Product"} ) in Step3

如果需要被替换的值不止三种,代码的长度可能就会变得十分长。在《发票号展开》中,施阳老师已经介绍过如何使用List.Accumulate()化简高度相似的重复代码,以下为沿用该思路的代码:

let ToRows = Table.ToRows( Parameter ), Outcome = List.Accumulate( ToRows, ProductList, (x, y) ⇒ Table.ReplaceValue( x, y{0}, y{1}, Replacer.ReplaceText, {"Product"} ) ) in Outcome

以下为代码中Parameter表格的图像:

代码中的ToRows步骤,把Parameter表格转化为{{"A(ii)", "A"}, {"B(ii)", "B"}, {"C(ii)", "C"}},此结果将会被用作List.Accmulate()的第一个参数。然后在下一步中,List.Accumulate会对ProductList进行Text.ReplaceValue操作,把Product列中所有的"A(ii)"替换成"A"。List.Accumulate()会对替换文本后的表格再进行类似的操作把"B(ii)"和"C(ii)"分别替换为"B"和"C"。除了以上思路,其实还可以利用记录(Record)的特点解决以上问题,以下为第二种思路的代码:

let TableToCols = Table.ToColumns( Parameter ), ListToRecord = Record.FromList( TableToCols{1}, TableToCols{0} ), Outcome = Table.ReplaceValue( ProductList, each [Product], each Record.FieldOrDefault( ListToRecord, [Product], [Product] ), Replacer.ReplaceText, {"Product"} ) in Outcome

要理解第二种思路,首先要了解由Parameter表格转化而来的ListToRecord,以下为ListToRecord的截图:

上图说明了ListToRecord其实是文本旧值与新值存在一一对应关系的数据结构。利用ListToRecord,如果当前行的文本为"A(ii)", "B(ii)"或者"C(ii)",就会被分别替换为"A", "B"或者"C"。如果当前行的文本为其他值,就会进行该值替换自身的操作。

附件 多重文本替代 (24 kB) 打赏赞(7)微海报分享


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3